package zlib

import (
	"encoding/base64"
	"fmt"
	"image"
	"image/draw"
	"image/jpeg"
	"image/png"
	"os"
)

// Img2Base64 将图片字节转换为base64字符串.imgType为图片扩展名.
func Img2Base64(fpath string) string {
	if !IsImg(fpath) {
		return ""
	}

	imgBuffer, err := os.ReadFile(fpath)
	if err != nil {
		return ""
	}

	ext := ExtName(fpath)
	return fmt.Sprintf("data:image/%s;base64,%s", ext, base64.StdEncoding.EncodeToString(imgBuffer))
}

// 读取JPEG图片返回image.Image对象
func ImageJPEG(ph string) (image.Image, error) {
	// 打开图片文件
	f, fileErr := os.Open(ph)
	if fileErr != nil {
		return nil, fileErr
	}
	// 退出时关闭文件
	defer f.Close()
	// 解码
	j, jErr := jpeg.Decode(f)
	if jErr != nil {
		return nil, jErr
	}
	// 返回解码后的图片
	return j, nil
}

// 读取PNG图片返回image.Image对象
func ImagePNG(ph string) (image.Image, error) {
	// 打开图片文件
	f, fileErr := os.Open(ph)
	if fileErr != nil {
		return nil, fileErr
	}
	// 退出时关闭文件
	defer f.Close()
	// 解码
	p, pErr := png.Decode(f)
	if pErr != nil {
		return nil, pErr
	}
	// 返回解码后的图片
	return p, nil
}

// 按照分辨率创建一张空白图片对象
func ImageRGBA(width, height int) *image.RGBA {
	// 建立图像,image.Rect(最小X,最小Y,最大X,最小Y)
	return image.NewRGBA(image.Rect(0, 0, width, height))
}

// 将图片绘制到图片
func ImageDrawRGBA(img *image.RGBA, imgcode image.Image, x, y int) {
	// 绘制图像
	// image.Point A点的X,Y坐标,轴向右和向下增加{0,0}
	// image.ZP ZP is the zero Point
	// image.Pt Pt is shorthand for Point{X, Y}
	draw.Draw(img, img.Bounds(), imgcode, image.Pt(x, y), draw.Over)
}

// 将图片绘制到图片
func ImageDrawRGBAOffSet(img *image.RGBA, imgcode image.Image, r image.Rectangle, x, y int) {
	// 绘制图像
	// image.Point A点的X,Y坐标,轴向右和向下增加{0,0}
	// image.ZP ZP is the zero Point
	// image.Pt Pt is shorthand for Point{X, Y}
	// r image.Rectangle img.Bounds() or img.Bounds().Add(offset)
	draw.Draw(img, r, imgcode, image.Pt(x, y), draw.Over)
}
